[レポート] AIでゲームキャラクターの表情を自動設定。Cygames社のAI活用事例セッション #CEDEC2023 #classmethod_game
こんにちは、ゲームソリューション部の入井です。
この記事ではCEDEC 2023で発表されたセッション「AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み」について、内容のまとめとその所感を書いていきます。
セッションの概要
AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み | CEDEC2023
この講演では社内のゲームプロジェクト向けに作成したゲーム内会話パートの感情分析ツールの開発について紹介します。
通常、ゲーム内の会話パートを作成するためにはシナリオと音声が完成した後で、細かい単位で表示する表情を設定していく必要があります。
こちらの講演ではAIを活用してシナリオと音声からキャラクターの感情分析を行い、キャラクターの表情を自動的に求める仕組みについて説明します。
感情分析を行うために自然言語処理・音声解析の複数の手法を試したので、それらの手順と結果について話す予定です。
講演者
立福 寛 氏
株式会社Cygames
開発運営支援
ゲームエンジニア
はじめに
感情分析ツールが必要になった経緯
ゲームのストーリーパートでは、シナリオテキストと共にキャラクターのグラフィックを表示することで、キャラクター同士の会話を表現する手法がよく使われます。キャラクターにはいくつもの表情パターンが用意されており、セリフの内容に応じて表情を変えることで、キャラクターの感情をユーザーにダイレクトに伝えることが可能です。
会話パートの開発にあたっては、スクリプトにてシナリオの進行とともにどのような表情のグラフィックを表示するかを1つずつ指定していきます。(もちろん、背景や音楽、ボイスの再生等もスクリプトでの指定が必要です)
今回のセッションでは、スクリプト作成時の表情指定にかかる作業量の多さが課題として上げられており、「シナリオテキストや音声からキャラクターの表情を自動的に設定できないだろうか?」という依頼をスクリプト開発チームから受けたことが、今回専用のツールを作成した経緯だったとのことです。
前提条件
今回の分析の前提条件として、対象となるシナリオは会話文のみとし、句読点・記号ごとに区切って感情を設定するという仕様が紹介されました。
また、分析結果となる感情については以下の5種類に分類したとのことです。(実際はキャラクターごとにもっと多くのパターンがある)
- 標準
- 喜び
- 悲しみ
- 怒り
- 照れ
他に、上記の分類を以下のようにまとめたケースも調べています。
- 標準
- ポジティブ
- 喜び
- 照れ
- ネガティブ
- 悲しみ
- 怒り
自然言語処理による感情分析
まず、自然言語処理で試した3つの方法の紹介がありました。
固有表現抽出タスクや文章分類タスクでは適切な分析ができなかった
自然言語処理では最初に固有表現抽出タスクを利用し、テキストの各部分に属性 = 感情を割り当てることで、シナリオテキストから感情を自動分析できないか試してみたとのことです。
※固有表現抽出タスク
文章の中に含まれる固有表現(≒固有名詞)を抜き出すことを目的にしたタスク。NER(Named Entity Recognition)とも呼ばれる。
例えば、「クラスメソッド株式会社の所在地は東京です。」というテキストから、「クラスメソッド株式会社」を会社名として、「東京」を地名として抽出することができる。
しかし、この手法では正確な感情が割り当てられなかったり、そもそも属性として割り当てるテキストの範囲が違っていたりと、今回の目的を達成するための分析ができませんでした。原因として、固有表現抽出タスクでは属性を割り当てる範囲を指定できないことが挙げられていました。
次に試したのが文章分類タスクによる分析です。
まず、固有表現抽出タスクでの失敗を踏まえ、そもそも自然言語処理で感情分析がどこまで可能なのか確認するため、句読点単位の分析の前に1行単位での分析を試したとのことです。
※文章分類タスク
与えられた文章がどのようなカテゴリに属するかを分類するタスク。
例えばアンケートの回答文を分析してその内容がポジティブかネガティブか分類したりできる。
分類を行うにあたり、複数の感情が入っていることを考慮し、以下の画像のように感情カテゴリの内容を設定しています。
1行単位の分析の結果としては以下の画像のようになりました。
5種類に分類した場合の正解率は49%とあまり高くありませんが、3種類に分類した場合では69%と高めの数字を達成しており、この結果から自然言語処理による感情分析は、実用に耐える程度の精度を出すことができるとわかりました。
実際のスクリプトでは句読点単位で感情を設定する必要があることから、続いて句読点単位での文章分類を試しましたが、1行単位の分析の時よりも低い精度になってしまったとのことです。原因としては、1行単位の時よりも文字数が少ないために情報量が不足してしまったことや、前後の文章の情報が無いことで文脈が分からないことが挙げられました。
質問応答タスクによって高精度な分析が可能に
感情分析の際「感情を求めたい文章」と「その前後の文章」を渡す必要があることから、次に試したのが質問応答タスクです。
※質問応答タスク
あらかじめ必要な前提条件=コンテキストが与えられた上で、質問に対する回答を行うタスク。
例えば「現在地は東京」というコンテキストが与えられた状態で「今何処にいますか?」という質問すると、「東京です」と回答することができる
感情分析に利用するため、以下の画像のようにコンテキストとして句読点単位で分割した各文章、質問として対象となる文章を与え、回答として対象の文章の感情(に対応する数値)を返すようにしています。
こちらの手法を使って22万件のデータセットに対してテストしたところ、これまでで一番高い精度を出すことができたとのことです。
更に、バッチサイズを限界まで大きくしたり、モデルをRoBERTaにする等の調整をすることで精度が向上できました。
※RoBERTa
BERTを改良した自然言語処理モデル。
BERTと比較して、事前学習の回数や使用するデータセットを大幅に増やす等の調整が行われており、性能においてBERTを上回る結果を出している。
また、学習データを改善して今まで「標準」として扱っていた基本感情以外の感情も活用したところ、更に精度を上げることができたとのことです。
一方で、学習データの水増しやモデルのトークン数の増加という方法も試しましたが、こちらは精度を上げることができませんでした。
最終的な結果として、以下の混同行列が紹介されました。高い精度を出すことができている一方で、ポジティブ・ネガティブの判別はできても、更に細かい感情の判別については誤った分析をしてしまうことがあり、特に「怒り」や「照れ」の分析が苦手なようです。
その理由として、そもそも「怒り」や「照れ」の学習データが少ないことや、人間でも判断が難しいことが挙げられました。
音声解析による感情分析
続いて、音声解析で試した2つの手法が紹介されました。
CNNによる分析を試したが精度が低い
音声の感情分析=音声の分類と解釈し、最初にCNNを使った分類を行いました。
※CNN
Convolutional Neural Networkの略で、日本語では畳み込みニューラルネットワークと言う。
画像認識・音声認識の分野で使われるディープラーニングアルゴリズムで、入力したデータの特徴量を抽出し、分類することができる。
学習に使う音声データは、元のボイスデータを句読点単位に分割することで用意しました。この時、ボイスデータの有音区間・無音区間を元に自動分割をしましたが、あまり確実な手段ではないため改善が必要な課題として残りました。
感情分析の正解率は30.8%と実用するには難しい精度となりました。原因として、そもそも効果音分類のための事前学習モデルだったこと、音声の自動分割の精度に難があることが挙げられました。
WhisperとSpeechBrain(Wav2Vec2)によって精度が向上
次に、SpeechBrainという音声関係の様々な機能が入ったパッケージソフトを使い、CNNによる分析で利用したデータを使って再度感情分析を行ったところ、精度の高い結果を出すことができました。そこで、学習データを作成し直した上で、SpeechBrainで本格的に分析を試してみることにしたとのことです。
speechbrain/speechbrain: A PyTorch-based Speech Toolkit
なお、SpeechBrainの中ではWav2Vec2という音声認識モデルが使用されています。
新たな学習データの作成には、WhisperXというソフトウェアが使用されました。これは、OpenAIのWhisperを活用したオープンソースのプロジェクトで、文字単位でいつ発話されたかのタイムスタンプが取得できる機能があります。
m-bain/whisperX: WhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)
先ほどの有音区間・無音区間による分割には精度に難がありましたが、WhisperXの高度な音声認識によるタイムスタンプ機能を利用することで精度の高い分割が可能になり、学習データを増やすことができました。
Wav2Vec2を新しく用意したデータセットで学習させ、テストしたところ以下の画像の結果となり、自然言語処理よりは低いもののかなり精度を上げることができました。ただ、分析対象の前後の音声を使った分析ができていないという課題も残りました。
実際の開発での活用結果
自然言語処理と音声解析の2つの方法で分析を試した結果、最終的な実装には精度の高さから自然言語処理による分析が採用されました。
その後、実際に感情分析ツールをスクリプトチームへ提供したところ、チーム全体で約10%の効率化をすることができたそうです。精度的には完全ではないため、自動分析後も手作業によるチェックや微調整は必要になりますが、それでも大きな効率化が達成できています。
また、ツール導入に合わせてJenkinsによるワークフローの整理も行われ、そちらのほうがチームへのインパクトが大きく「AIよりも役に立ってしまったかもしれません」とのこと。
最後の振り返りでは音声解析を実用化できなかったことを残念に感じられていましたが、最近音声による感情分析の事例が増えてきたため、また改めて試していきたいとのことでした。
感想
私自身、昔プライベートでノベルゲームを作っていた時、スクリプトによる立ち絵表示等の細かい演出指定をやったことがあるため、今回のセッションの課題は何処か親近感を抱きました。個人開発でもそこそこの作業量になるのだから、規模が遥かに大きい商業ゲームではとんでもない工数になるんだろうなと思いながら聞いていました。
今回の方法を応用してシナリオテキストから様々な情報を分析できるようにすれば、立ち絵だけでなく背景やBGM等の割当も自動化できそうだと思いました。もちろん、完璧な精度で割り当てるのは現状では不可能と思いますが、それでもある程度の精度で仮で割り当てられているだけでも、作業工数はかなり削減できると思われます。
ゲーム開発現場での機械学習技術の活用事例として、非常に勉強になるセッションでした。